package etm.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;

import upc.condominio.modelo.Ambiente;
import upc.condominio.modelo.Reserva;
import upc.condominio.modelo.ReservaHoras;
import upc.condominio.modelo.Residente;
import upc.condominio.modelo.UbicacionVivienda;
import upc.condominio.util.ConexionBD;
import etm.excepcion.DAOExcepcion;

public class ReservaDAO extends BaseDAO {

	
	public Collection<Reserva> listar() throws DAOExcepcion {
		System.out.println("ReservaDAO: listar()");
		Collection<Reserva> c = new ArrayList<Reserva>();
		Residente rsResidente = null;
		ResidenteDAO daoResidente =null;
		Ambiente rsAmbiente = null;
		AmbienteDAO daoAmbiente = null;
		UbicacionVivienda rsUbicacion = null;
		UbicacionDAO daoUbicacion = null;
		ReservaHoras rsReservaHoras = null;
		ReservaHorasDAO daoReservaHoras = null;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT idReserva, idAmbiente, idResidente, idUbicacion, FechaInicio, idrhoras " +
							"from reserva;";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Reserva vo = new Reserva();
				vo.setIdReserva(rs.getInt("idReserva"));
				vo.setIdAmbiente(rs.getInt("idAmbiente"));
				vo.setIdResidente(rs.getInt("idResidente"));
				vo.setIdUbicacion(rs.getInt("idUbicacion"));
				vo.setFechaInicio(rs.getDate("FechaInicio"));
				vo.setHoraInicio(rs.getInt("idrhoras"));
				
				daoResidente = new ResidenteDAO();
				rsResidente = daoResidente.buscarporId(rs.getInt("idResidente"));
				vo.setRsResidente(rsResidente);
				
				daoAmbiente = new AmbienteDAO();
				rsAmbiente = daoAmbiente.buscarporId(rs.getInt("idAmbiente"));
				vo.setRsAmbiente(rsAmbiente);
				
				daoUbicacion = new UbicacionDAO();
				rsUbicacion = daoUbicacion.buscarporId(rs.getInt("idUbicacion"));
				vo.setRsUbicacion(rsUbicacion);
				
				daoReservaHoras = new ReservaHorasDAO();
				rsReservaHoras = daoReservaHoras.buscarporId(rs.getInt("idrhoras"));
				vo.setRsReservaHoras(rsReservaHoras);
				
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	public Collection<Reserva> buscarPorAmb(int idAmb) throws DAOExcepcion {
		System.out.println("ReservaDAO: buscarPorAmb(int idAmb)" + idAmb);
		String query =	"SELECT idReserva, idAmbiente, idResidente, idUbicacion, FechaInicio, idrhoras from reserva where idAmbiente = ? ;";
		Collection<Reserva> c = new ArrayList<Reserva>();
		Residente rsResidente = null;
		ResidenteDAO daoResidente =null;
		Ambiente rsAmbiente = null;
		AmbienteDAO daoAmbiente = null;
		UbicacionVivienda rsUbicacion = null;
		UbicacionDAO daoUbicacion = null;
		ReservaHoras rsReservaHoras = null;
		ReservaHorasDAO daoReservaHoras = null;		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idAmb);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Reserva vo = new Reserva();
				vo.setIdReserva(rs.getInt("idReserva"));
				vo.setIdAmbiente(rs.getInt("idAmbiente"));
				vo.setIdResidente(rs.getInt("idResidente"));
				vo.setIdUbicacion(rs.getInt("idUbicacion"));
				vo.setFechaInicio(rs.getDate("FechaInicio"));
				vo.setHoraInicio(rs.getInt("idrhoras"));
				
				daoResidente = new ResidenteDAO();
				rsResidente = daoResidente.buscarporId(rs.getInt("idResidente"));
				vo.setRsResidente(rsResidente);
				
				daoAmbiente = new AmbienteDAO();
				rsAmbiente = daoAmbiente.buscarporId(rs.getInt("idAmbiente"));
				vo.setRsAmbiente(rsAmbiente);
				
				daoUbicacion = new UbicacionDAO();
				rsUbicacion = daoUbicacion.buscarporId(rs.getInt("idUbicacion"));
				vo.setRsUbicacion(rsUbicacion);				

				daoReservaHoras = new ReservaHorasDAO();
				rsReservaHoras = daoReservaHoras.buscarporId(rs.getInt("idrhoras"));
				vo.setRsReservaHoras(rsReservaHoras);
		
				c.add(vo);
			
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}	
	
	
	public void insertar(Reserva vo) throws DAOExcepcion {
		System.out.println("ReservaDAO: insertar(Reserva vo)");
		String query = "INSERT INTO reserva(idReserva, idAmbiente, idResidente, idUbicacion, FechaInicio, idrhoras) VALUES (?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getIdReserva());
			stmt.setInt(2, vo.getIdAmbiente());
			stmt.setInt(3, vo.getIdResidente());
			stmt.setInt(4, vo.getIdUbicacion());
			stmt.setDate(5, vo.getFechaInicio());
			stmt.setInt(6, vo.getHoraInicio());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}	
	
	public void eliminar(int IdRes) throws DAOExcepcion {
		System.out.println("ReservaDAO: eliminar(Int idRes)"+IdRes);
		String query = "DELETE FROM reserva WHERE idReserva=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, IdRes);
			int i = stmt.executeUpdate();
			if (i != 1) {

				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}	
	
	
}
